package partThree;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/* 本类用于进一步测试List接口的练习*/
public class TestList2 {
    public static void main(String[] args) {
        //1.创建多态对象
        List<String> list = new ArrayList<>();
        //2.向接口中添加元素
        list.add("喜羊羊");
        list.add("美羊羊");
        list.add("懒羊羊");
        list.add("小肥羊");
        list.add("肥牛卷");
        System.out.println(list);

        //3.测试集合的迭代
        /* 集合的迭代方式：
        1.for循环
        2.foreach 高效for循环
        3.iterator
        4.listIterator
        */
        //方式一：因为List集合是有序的，元素有下标的，所以可以根据下标进行遍历
        //从哪开始：0  到哪结束：list.size()-1  如何变化++
        //i代表的就是集合中元素的索引值
        for(int i = 0;i<list.size();i++){
            //根据本轮循环遍历到的索引值获取对应的集合元素
            System.out.println(list.get(i));
        }
        System.out.println("************方式一结束*************");

        //方式二：因为普通for循环遍历效率低，语法复杂，所以使用高效for来遍历
        //格式for(本轮遍历到的元素类型 元素名 ：要遍历的内容名){循环体}
        for( String s : list){
            System.out.println(s);
        }
        System.out.println("************方式二结束*************");

        //方式三：从父接口中继承过来的迭代器iterator
        //1.获取对应的迭代器对象
        System.out.println("Before iterate : " + list);
        Iterator<String> it = list.iterator();
        //2.通过刚刚获取到的迭代器循环迭代集合中的所有元素
        while(it.hasNext()){//判断是否仍有下一个元素可以迭代
            //获取当前位置的元素，并将游标移动到下一个位置
            String s = it.next();
            if("肥牛卷".equals(s)){
                it.remove();
            }
        }
        System.out.println("After iterate : " + list);
        System.out.println("************方式三结束*************");

        /**方式四：listIterator属于List接口特有的迭代器
         * Iterator<E>--父接口--hasNext() next()
         * ListIterator<E>--子接口--除了父接口的功能以外
         * 还有自己的特有功能，比如逆序遍历，添加元素等等，但是不常用
         * public interface ListIterator<E>extends Iterator<E>*/
        //1.获取迭代器对象
        ListIterator<String> it2 = list.listIterator();
        //2.判断是否有下一个元素可以迭代
        while(it2.hasNext()){
            System.out.println(it2.next());
        }
        System.out.println("************方式四结束*************");

        System.out.println("listIterator的逆序遍历：");
        ListIterator<String> it3 = list.listIterator();
        while(it3.hasNext()){//判断是否有下一个元素可迭代
            System.out.println(it3.next());//打印当前迭代到的元素
            if(!it3.hasNext()){//直到迭代器没有下一个元素可迭代--到最后了
                System.out.println("开始逆序迭代：");
                while (it3.hasPrevious()){//判断是否有上一个元素可迭代
                    System.out.println(it3.previous());//打印获取到的上一个元素
                }
                break;//终止循环，不然会一直从头到尾，再从尾到头迭代
            }
        }
        System.out.println("************方式五结束*************");
    }
}